<?php

/**
 * 微信接口框架加密类
 * Class WxAes
 */
class WxAes
{
    // 密钥（16进制任意位字符串）
    public static $_key;

    /**
     * 计算密钥和偏移
     * @param string $key
     * @param string $iv
     * @param string $iv_size
     */
    private static function get(&$key, &$iv, &$iv_size = '')
    {
        $key = pack('H*', self::$_key);
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    }

    /**
     * 数据加密
     * @param string $data
     * @return string
     */
    public static function encrypt($data = '')
    {
        self::get($key, $iv);
        $data = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
        $data = $iv . $data;
        return rawurlencode(base64_encode($data));
    }

    /**
     * 数据解密
     * @param string $data
     * @return string
     */
    public static function decrypt($data = '')
    {
        self::get($key, $iv, $iv_size);
        $data = base64_decode(rawurldecode($data));
        $iv_dec = substr($data, 0, $iv_size);
        $data = substr($data, $iv_size);
        $data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv_dec);
        /**
         * 根据官方文档：http://php.net/manual/zh/function.mcrypt-decrypt.php
         * “如果数据大小不是 n * 分组大小，则在其后追加 '\0' 来补齐。”
         * 解密后的数据尾部会出现大量\0(null)，因此需要过滤掉
         */
        return rtrim($data, "\0");
    }

}